package com.zhw.learning.designpattern.proxypattern.cglibproxy;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @author Administrator
 * cglib是针对类来实现代理的，原理是对指定的业务类生成一个子类，
 * 并覆盖其中业务方法实现代理。因为采用的是继承，所以不能对final修饰的类进行代理。
 */
@Slf4j
public class Proxy3 implements MethodInterceptor {

    // 业务类对象，供代理方法中进行真正的业务方法调用
    private Object object;

    public Proxy3(Object o) {



        this.object = o;
    }

    // 相当于JDK动态代理中的绑定
    public Object getProxyInstance() {
        // 创建加强器，用来创建动态代理类
        Enhancer enhancer = new Enhancer();
        // 为加强器指定要代理的业务类（即：为下面生成的代理类指定父类）
        enhancer.setSuperclass(this.object.getClass());
        // 设置回调函数
        enhancer.setCallback(this);
        // 创建子类(代理对象)
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

        log.info("CGLIB代理前置内容");
        log.info("Method:" + method);
        //调用业务类（父类中）的方法
        Object obj = methodProxy.invokeSuper(o, objects);
        log.info("CGLIB代理后置内容");

        return obj;
    }
}
